COBS: A Background

The Comparison of Biofuels Systems (COBS) is a field trial and collaboration between Iowa State University and the University of Illinois. The COBS experiment seeks to compare the impacts of different biofuel production systems. Of particular interest is the impact of the prodcution system on carbon cycling and soil health. In order to investigate this impact, a unique soil sampling was performed in 2012, so that metagenomes could be assembled and used to explore the distribution of carbon cycling genes.

What made this soil sampling unique was the seperation of the soil into aggregate fraction, in a non-destructive maner. In short, the soil was sieved at 4 degrees c. using sieves that coorospoind to the aggregate fraction of interest.

Previous investigations into this data set have shown that there is a distribution/differences in bacterial communities accross aggregate fractions and croping systems.

What is an aggregate? Soil aggregates are groups of soil particles that bind to each other more strongly than to adjacent particles. The space between the aggregates provide pore space for retention and exchange of air and water.

What is a metagenome? A library constructed from the DNA extracted from all organisms in the soil.

So we have a unique dataset that consists of all the DNA from soil aggregate fractions from the COBS experiment. In addition to the genomic data, we started with metadata that was not tidy.

Our challenge was to use the metagenome libraries to construct abundance tables that quantify the abundance of bacterial species capable of performing a step in the decompostion of celluslose. In order to facilitate our analysis of these data in R, we had to tidy up the COBS metadata. The metadata consists of many chemical and physical characteristics of the soil samples from the cobs aggregate fractions.

For investigating the presence of ceullityic bacteria, we needed to generate a list of bacterial sequences associated with cellulose degredation. We did this by searching the NCBI database for amino acid sequences associated with 1 of 3 enzymes. The enzymes we are interested are all involved in the break down of cellulose in the soil. Once we have this list, we can compare the aggregate fractions for the abundance of cellulytic bacteria.

We can do this by quantifying the amount of bacteria that have genes associated with carbon degrading enzymes of intrest. These enzymes are:

  1. (BG) beta-glucosidase [EC:3.2.1.21] is an Endocellulase
  2. (BX) beta-D-xylosidase 4 [EC:3.2.1.37] is an Exocellulase
  3. (CB) 1,4-beta-cellobiosidase [EC:3.2.1.91] is a Cellobiase

Together these thre enzymes can convert a cellulose crystal to glucose molecules.

Stuff below this line should be put into the appendix, not a part of the actual presentation

First, let’s confirm that we have the required tools for asking questions of the NCBI database. To do this we will use the NCBI API: Entrez Direct and install it via the UNIX command line.

pwd
cd ~
perl -MNet::FTP -e \
  '$ftp = new Net::FTP("ftp.ncbi.nlm.nih.gov", Passive => 1);
   $ftp->login; $ftp->binary;
   $ftp->get("/entrez/entrezdirect/edirect.zip");'
unzip -u -q edirect.zip
rm edirect.zip
export PATH=$PATH:$HOME/edirect
./edirect/setup.sh

Let’s take a look to confirm that it was installed in the home directory:

cd ~
ls
Applications
Box Sync
Desktop
Documents
Downloads
Google Drive
Keys
Library
Movies
Music
Pictures
Public
anaconda
chiAISME.R
edirect

Now that we have the tools, what will we use them for? COBS is a unique dataset that includes many metagenomes from soil aggregates. Many functions in ecosystems are microbially mediated and catalyzed by enzymes. In this study, funded by the DOE, we are interested in carnon cycleing and therefore the enyzmes associated with that funciton. Our collaborator (Kirsten Hofmockel) has identified a few enzymes of interest for our system. The list of enzymes is contained in a text file: ec_numbers.txt Let’s navigate to that directory and take a look:

bashbash cd ~/Documents/COBS_CAZY cat ec_numbers.txt

We now have a list of enzymes of interest, let’s use those NCBI tools to find bacterial sequences associated with those enzymes by creating a python script:

import sys
from Bio import Entrez, SeqIO

Entrez.email = 'jflater@iastate.edu'

# First, find entries that contain the E.C. number
ec_num = sys.argv[1].strip()
#print ec_num
#print 'E.C. '+ ec_num
esearch_handle = Entrez.esearch(db='nucleotide', term='EC '+ec_num)
# When term='E.C. we get zero results, however, if term=EC it works
entries = Entrez.read(esearch_handle)
esearch_handle.close()

# Second, fetch these entries
efetch_handle = Entrez.efetch(db='nucleotide', id=entries['IdList'], rettype='gb', retmode='xml') 
records = Entrez.parse(efetch_handle)

# Now, we go through the records and look for a feature with name 'EC_number'
for record in records:
      for feature in record['GBSeq_feature-table']:
          for subfeature in feature['GBFeature_quals']:
              if (subfeature['GBQualifier_name'] == 'EC_number'   and
                subfeature['GBQualifier_value'] == ec_num):

                    # If we found it, we extract the seq's start and end
                    accession = record['GBSeq_primary-accession']
                    interval = feature['GBFeature_intervals'][0]
                    interval_start = interval['GBInterval_from']
                    interval_end = interval['GBInterval_to']
                    location = feature['GBFeature_location']
                    if location.startswith('complement'):
                        strand = 2
                    else:
                        strand = 1

                    # Now we fetch the nucleotide sequence
                    handle = Entrez.efetch(db="nucleotide", id=accession,
                                           rettype="fasta", strand=strand,
                                           seq_start = interval_start,
                                           seq_stop = interval_end)
                    seq = SeqIO.read(handle, "fasta")

                    print('>GenBank Accession:{}'.format(accession))
                    print(seq.seq)
efetch_handle.close()

Now let’s apply that script to our list of EC #’s by using the command line:

while read line;     
  do python scripts/nucl_from_ec.py $line > "$line".txt;    
  done < ec_numbers.txt

bashbash cd Documents/COBS_CAZY less 3.2.1.37.txt

To use hpcc: Lot’s of disc space, temporary unlimited (3 months)

bashbash ssh *****@hpcc.msu.edu password: #We are now at the gateway, we must connect to a development node ssh dv-intel16 #Now we move to a scratch folder cd /mnt/scratch/*****

Now that we are in a space where we can download data and perform work, let’s download the NCBI db

bashbash #Make a directory for this project mkdir COBS_CAZY cd COBS_CAZY/ #now we create a program to downlaod the db emacs download.refseq.qsub

now lets download db to that ftp://ftp.ncbi.nlm.nih.gov refseq_protien.10.tar.gz.md5 and *.gz is what we want to put on HPCC

bashbash pwd cd Documents/COBS_CAZY/scripts cat download.refseq.qsub

In HPC: move out of dev intel…everyone is using it. There are many more computers to choose from begind that…called nodes We want to work in a node, we need to submit a job by using qsub

[*****@dev-intel16 ~]$ cd /mnt/scratch/***** [*****@dev-intel16 *****]$ ls [*****@dev-intel16 *****]$ mkdir COBS_CAZY [*****@dev-intel16 *****]$ cd COBS_CAZY/ [*****@dev-intel16 COBS_CAZY]$ emacs download.refseq.qsub

[1]+ Stopped emacs download.refseq.qsub [*****@dev-intel16 COBS_CAZY]$ ls download.refseq.qsub download.refseq.qsub~ [*****@dev-intel16 COBS_CAZY]$ rm *~ [*****@dev-intel16 COBS_CAZY]$ ls download.refseq.qsub [*****@dev-intel16 COBS_CAZY]$ qsub download.refseq.qsub 37523906.mgr-04.i [*****@dev-intel16 COBS_CAZY]$ ls download.refseq.qsub [*****@dev-intel16 COBS_CAZY]$

.o is output, .e is error

S = Q in line S = R running S = C complete

Check if everything downloaded correctly by using md5(it tells us if downloaded correctly) Once all is downlaoded, unzip

Then ready to run blastp (files in fasta) clone the github repository # note change spellin on protein for emacs

module load git (to upload repository) git clone url once repository is uploaded then blastp

submit blastp: qsub blastp.qsub

2016_12_02:09:06 AM, Noticed that we did not qsub blastp for EC *.86, let’s make that script and submit the job.

ssh *****@hpcc.msu.edu
password:
ssh dev-intel16
cd /mnt/scratch/*****/COBS_CAZY
ls
LS0tCnRpdGxlOiAiQ09CU19DQVpZIgpyb290OiAuLi8uLi8uLi8Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQohW10oaW1hZ2VzL0NPQlNQSUMucG5nKQotLS0tLS0KI0NPQlM6IEEgQmFja2dyb3VuZAoKVGhlIENvbXBhcmlzb24gb2YgQmlvZnVlbHMgU3lzdGVtcyAoQ09CUykgaXMgYSBmaWVsZCB0cmlhbCBhbmQgY29sbGFib3JhdGlvbiBiZXR3ZWVuIElvd2EgU3RhdGUgVW5pdmVyc2l0eSBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMuIFRoZSBDT0JTIGV4cGVyaW1lbnQgc2Vla3MgdG8gY29tcGFyZSB0aGUgaW1wYWN0cyBvZiBkaWZmZXJlbnQgYmlvZnVlbCBwcm9kdWN0aW9uIHN5c3RlbXMuIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgaXMgdGhlIGltcGFjdCBvZiB0aGUgcHJvZGN1dGlvbiBzeXN0ZW0gb24gY2FyYm9uIGN5Y2xpbmcgYW5kIHNvaWwgaGVhbHRoLiBJbiBvcmRlciB0byBpbnZlc3RpZ2F0ZSB0aGlzIGltcGFjdCwgYSB1bmlxdWUgc29pbCBzYW1wbGluZyB3YXMgcGVyZm9ybWVkIGluIDIwMTIsIHNvIHRoYXQgbWV0YWdlbm9tZXMgY291bGQgYmUgYXNzZW1ibGVkIGFuZCB1c2VkIHRvIGV4cGxvcmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjYXJib24gY3ljbGluZyBnZW5lcy4gCgpXaGF0IG1hZGUgdGhpcyBzb2lsIHNhbXBsaW5nIHVuaXF1ZSB3YXMgdGhlIHNlcGVyYXRpb24gb2YgdGhlIHNvaWwgaW50byBhZ2dyZWdhdGUgZnJhY3Rpb24sIGluIGEgbm9uLWRlc3RydWN0aXZlIG1hbmVyLiBJbiBzaG9ydCwgdGhlIHNvaWwgd2FzIHNpZXZlZCBhdCA0IGRlZ3JlZXMgYy4gdXNpbmcgc2lldmVzIHRoYXQgY29vcm9zcG9pbmQgdG8gdGhlIGFnZ3JlZ2F0ZSBmcmFjdGlvbiBvZiBpbnRlcmVzdC4gCgpQcmV2aW91cyBpbnZlc3RpZ2F0aW9ucyBpbnRvIHRoaXMgZGF0YSBzZXQgaGF2ZSBzaG93biB0aGF0IHRoZXJlIGlzIGEgZGlzdHJpYnV0aW9uL2RpZmZlcmVuY2VzIGluIGJhY3RlcmlhbCBjb21tdW5pdGllcyBhY2Nyb3NzIGFnZ3JlZ2F0ZSBmcmFjdGlvbnMgYW5kIGNyb3Bpbmcgc3lzdGVtcy4gCiFbXShpbWFnZXMvQ09CU2NvbXBvc2l0aW9uLnBuZykKIVtdKGltYWdlcy9BR0dkaXN0LnBuZykKCgpXaGF0IGlzIGFuIGFnZ3JlZ2F0ZT8KICBTb2lsIGFnZ3JlZ2F0ZXMgYXJlIGdyb3VwcyBvZiBzb2lsIHBhcnRpY2xlcyB0aGF0IGJpbmQgdG8gZWFjaCBvdGhlciBtb3JlIHN0cm9uZ2x5IHRoYW4gdG8gYWRqYWNlbnQgcGFydGljbGVzLiBUaGUgc3BhY2UgYmV0d2VlbiB0aGUgYWdncmVnYXRlcyAgIHByb3ZpZGUgcG9yZSBzcGFjZSBmb3IgcmV0ZW50aW9uIGFuZCBleGNoYW5nZSBvZiBhaXIgYW5kIHdhdGVyLgoKV2hhdCBpcyBhIG1ldGFnZW5vbWU/IAogIEEgbGlicmFyeSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBETkEgZXh0cmFjdGVkIGZyb20gYWxsIG9yZ2FuaXNtcyBpbiB0aGUgc29pbC4gCiAgClNvIHdlIGhhdmUgYSB1bmlxdWUgZGF0YXNldCB0aGF0IGNvbnNpc3RzIG9mIGFsbCB0aGUgRE5BIGZyb20gc29pbCBhZ2dyZWdhdGUgZnJhY3Rpb25zIGZyb20gdGhlIENPQlMgZXhwZXJpbWVudC4gSW4gYWRkaXRpb24gdG8gdGhlIGdlbm9taWMgZGF0YSwgd2Ugc3RhcnRlZCB3aXRoIG1ldGFkYXRhIHRoYXQgd2FzIG5vdCB0aWR5LgoKT3VyIGNoYWxsZW5nZSB3YXMgdG8gdXNlIHRoZSBtZXRhZ2Vub21lIGxpYnJhcmllcyB0byBjb25zdHJ1Y3QgYWJ1bmRhbmNlIHRhYmxlcyB0aGF0IHF1YW50aWZ5IHRoZSBhYnVuZGFuY2Ugb2YgYmFjdGVyaWFsIHNwZWNpZXMgY2FwYWJsZSBvZiBwZXJmb3JtaW5nIGEgc3RlcCBpbiB0aGUgZGVjb21wb3N0aW9uIG9mIGNlbGx1c2xvc2UuIEluIG9yZGVyIHRvIGZhY2lsaXRhdGUgb3VyIGFuYWx5c2lzIG9mIHRoZXNlIGRhdGEgaW4gUiwgd2UgaGFkIHRvIHRpZHkgdXAgdGhlIENPQlMgbWV0YWRhdGEuIFRoZSBtZXRhZGF0YSBjb25zaXN0cyBvZiBtYW55IGNoZW1pY2FsIGFuZCBwaHlzaWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHNvaWwgc2FtcGxlcyBmcm9tIHRoZSBjb2JzIGFnZ3JlZ2F0ZSBmcmFjdGlvbnMuIAoKRm9yIGludmVzdGlnYXRpbmcgdGhlIHByZXNlbmNlIG9mIGNldWxsaXR5aWMgYmFjdGVyaWEsIHdlIG5lZWRlZCB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgYmFjdGVyaWFsIHNlcXVlbmNlcyBhc3NvY2lhdGVkIHdpdGggY2VsbHVsb3NlIGRlZ3JlZGF0aW9uLiBXZSBkaWQgdGhpcyBieSBzZWFyY2hpbmcgdGhlIE5DQkkgZGF0YWJhc2UgZm9yIGFtaW5vIGFjaWQgc2VxdWVuY2VzIGFzc29jaWF0ZWQgd2l0aCAxIG9mIDMgZW56eW1lcy4gVGhlIGVuenltZXMgd2UgYXJlIGludGVyZXN0ZWQgYXJlIGFsbCBpbnZvbHZlZCBpbiB0aGUgYnJlYWsgZG93biBvZiBjZWxsdWxvc2UgaW4gdGhlIHNvaWwuIE9uY2Ugd2UgaGF2ZSB0aGlzIGxpc3QsIHdlIGNhbiBjb21wYXJlIHRoZSBhZ2dyZWdhdGUgZnJhY3Rpb25zIGZvciB0aGUgYWJ1bmRhbmNlIG9mIGNlbGx1bHl0aWMgYmFjdGVyaWEuIAoKV2UgY2FuIGRvIHRoaXMgYnkgcXVhbnRpZnlpbmcgdGhlIGFtb3VudCBvZiBiYWN0ZXJpYSB0aGF0IGhhdmUgZ2VuZXMgYXNzb2NpYXRlZCB3aXRoIGNhcmJvbiBkZWdyYWRpbmcgZW56eW1lcyBvZiBpbnRyZXN0LiBUaGVzZSBlbnp5bWVzIGFyZTogCgogIDEuIChCRykgYmV0YS1nbHVjb3NpZGFzZSBbRUM6My4yLjEuMjFdIGlzIGFuIEVuZG9jZWxsdWxhc2UKICAyLiAoQlgpIGJldGEtRC14eWxvc2lkYXNlIDQgW0VDOjMuMi4xLjM3XSBpcyBhbiBFeG9jZWxsdWxhc2UKICAzLiAoQ0IpIDEsNC1iZXRhLWNlbGxvYmlvc2lkYXNlIFtFQzozLjIuMS45MV0gaXMgYSBDZWxsb2JpYXNlCiAgClRvZ2V0aGVyIHRoZXNlIHRocmUgZW56eW1lcyBjYW4gY29udmVydCBhIGNlbGx1bG9zZSBjcnlzdGFsIHRvIGdsdWNvc2UgbW9sZWN1bGVzLiAgCgohW10oaW1hZ2VzL1R5cGVzX29mX0NlbGx1bGFzZTIucG5nKQoKIyMjU3R1ZmYgYmVsb3cgdGhpcyBsaW5lIHNob3VsZCBiZSBwdXQgaW50byB0aGUgYXBwZW5kaXgsIG5vdCBhIHBhcnQgb2YgdGhlIGFjdHVhbCBwcmVzZW50YXRpb24KRmlyc3QsIGxldCdzIGNvbmZpcm0gdGhhdCB3ZSBoYXZlIHRoZSByZXF1aXJlZCB0b29scyBmb3IgYXNraW5nIHF1ZXN0aW9ucyBvZiB0aGUgTkNCSSBkYXRhYmFzZS4gVG8gZG8gdGhpcyB3ZSB3aWxsIHVzZSB0aGUgTkNCSSBBUEk6IEVudHJleiBEaXJlY3QgYW5kIGluc3RhbGwgaXQgdmlhIHRoZSBVTklYIGNvbW1hbmQgbGluZS4gCmBgYHtiYXNoLCBldmFsPUZBTFNFfQpwd2QKY2QgfgpwZXJsIC1NTmV0OjpGVFAgLWUgXAogICckZnRwID0gbmV3IE5ldDo6RlRQKCJmdHAubmNiaS5ubG0ubmloLmdvdiIsIFBhc3NpdmUgPT4gMSk7CiAgICRmdHAtPmxvZ2luOyAkZnRwLT5iaW5hcnk7CiAgICRmdHAtPmdldCgiL2VudHJlei9lbnRyZXpkaXJlY3QvZWRpcmVjdC56aXAiKTsnCnVuemlwIC11IC1xIGVkaXJlY3QuemlwCnJtIGVkaXJlY3QuemlwCmV4cG9ydCBQQVRIPSRQQVRIOiRIT01FL2VkaXJlY3QKLi9lZGlyZWN0L3NldHVwLnNoCmBgYApMZXQncyB0YWtlIGEgbG9vayB0byBjb25maXJtIHRoYXQgaXQgd2FzIGluc3RhbGxlZCBpbiB0aGUgaG9tZSBkaXJlY3Rvcnk6CmBgYHtiYXNofQpjZCB+CmxzCmBgYApOb3cgdGhhdCB3ZSBoYXZlIHRoZSB0b29scywgd2hhdCB3aWxsIHdlIHVzZSB0aGVtIGZvcj8gQ09CUyBpcyBhIHVuaXF1ZSBkYXRhc2V0IHRoYXQgaW5jbHVkZXMgbWFueSBtZXRhZ2Vub21lcyBmcm9tIHNvaWwgYWdncmVnYXRlcy4gTWFueSBmdW5jdGlvbnMgaW4gZWNvc3lzdGVtcyBhcmUgbWljcm9iaWFsbHkgbWVkaWF0ZWQgYW5kIGNhdGFseXplZCBieSBlbnp5bWVzLiBJbiB0aGlzIHN0dWR5LCBmdW5kZWQgYnkgdGhlIERPRSwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2Fybm9uIGN5Y2xlaW5nIGFuZCB0aGVyZWZvcmUgdGhlIGVueXptZXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnVuY2l0b24uIE91ciBjb2xsYWJvcmF0b3IgKEtpcnN0ZW4gSG9mbW9ja2VsKSBoYXMgaWRlbnRpZmllZCBhIGZldyBlbnp5bWVzIG9mIGludGVyZXN0IGZvciBvdXIgc3lzdGVtLiBUaGUgbGlzdCBvZiBlbnp5bWVzIGlzIGNvbnRhaW5lZCBpbiBhIHRleHQgZmlsZTogZWNfbnVtYmVycy50eHQKTGV0J3MgbmF2aWdhdGUgdG8gdGhhdCBkaXJlY3RvcnkgYW5kIHRha2UgYSBsb29rOgpgYGB7YmFzaH0KY2Qgfi9Eb2N1bWVudHMvQ09CU19DQVpZCmNhdCBlY19udW1iZXJzLnR4dApgYGAKV2Ugbm93IGhhdmUgYSBsaXN0IG9mIGVuenltZXMgb2YgaW50ZXJlc3QsIGxldCdzIHVzZSB0aG9zZSBOQ0JJIHRvb2xzIHRvIGZpbmQgYmFjdGVyaWFsIHNlcXVlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhvc2UgZW56eW1lcyBieSBjcmVhdGluZyBhIHB5dGhvbiBzY3JpcHQ6ICAKYGBge3B5dGhvbiwgZXZhbD1GQUxTRX0KaW1wb3J0IHN5cwpmcm9tIEJpbyBpbXBvcnQgRW50cmV6LCBTZXFJTwoKRW50cmV6LmVtYWlsID0gJ2pmbGF0ZXJAaWFzdGF0ZS5lZHUnCgojIEZpcnN0LCBmaW5kIGVudHJpZXMgdGhhdCBjb250YWluIHRoZSBFLkMuIG51bWJlcgplY19udW0gPSBzeXMuYXJndlsxXS5zdHJpcCgpCiNwcmludCBlY19udW0KI3ByaW50ICdFLkMuICcrIGVjX251bQplc2VhcmNoX2hhbmRsZSA9IEVudHJlei5lc2VhcmNoKGRiPSdudWNsZW90aWRlJywgdGVybT0nRUMgJytlY19udW0pCiMgV2hlbiB0ZXJtPSdFLkMuIHdlIGdldCB6ZXJvIHJlc3VsdHMsIGhvd2V2ZXIsIGlmIHRlcm09RUMgaXQgd29ya3MKZW50cmllcyA9IEVudHJlei5yZWFkKGVzZWFyY2hfaGFuZGxlKQplc2VhcmNoX2hhbmRsZS5jbG9zZSgpCgojIFNlY29uZCwgZmV0Y2ggdGhlc2UgZW50cmllcwplZmV0Y2hfaGFuZGxlID0gRW50cmV6LmVmZXRjaChkYj0nbnVjbGVvdGlkZScsIGlkPWVudHJpZXNbJ0lkTGlzdCddLCByZXR0eXBlPSdnYicsIHJldG1vZGU9J3htbCcpIApyZWNvcmRzID0gRW50cmV6LnBhcnNlKGVmZXRjaF9oYW5kbGUpCgojIE5vdywgd2UgZ28gdGhyb3VnaCB0aGUgcmVjb3JkcyBhbmQgbG9vayBmb3IgYSBmZWF0dXJlIHdpdGggbmFtZSAnRUNfbnVtYmVyJwpmb3IgcmVjb3JkIGluIHJlY29yZHM6CiAgICAgIGZvciBmZWF0dXJlIGluIHJlY29yZFsnR0JTZXFfZmVhdHVyZS10YWJsZSddOgogICAgICAgICAgZm9yIHN1YmZlYXR1cmUgaW4gZmVhdHVyZVsnR0JGZWF0dXJlX3F1YWxzJ106CiAgICAgICAgICAgICAgaWYgKHN1YmZlYXR1cmVbJ0dCUXVhbGlmaWVyX25hbWUnXSA9PSAnRUNfbnVtYmVyJyAgIGFuZAogICAgICAgICAgICAgICAgc3ViZmVhdHVyZVsnR0JRdWFsaWZpZXJfdmFsdWUnXSA9PSBlY19udW0pOgoKICAgICAgICAgICAgICAgICAgICAjIElmIHdlIGZvdW5kIGl0LCB3ZSBleHRyYWN0IHRoZSBzZXEncyBzdGFydCBhbmQgZW5kCiAgICAgICAgICAgICAgICAgICAgYWNjZXNzaW9uID0gcmVjb3JkWydHQlNlcV9wcmltYXJ5LWFjY2Vzc2lvbiddCiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBmZWF0dXJlWydHQkZlYXR1cmVfaW50ZXJ2YWxzJ11bMF0KICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbF9zdGFydCA9IGludGVydmFsWydHQkludGVydmFsX2Zyb20nXQogICAgICAgICAgICAgICAgICAgIGludGVydmFsX2VuZCA9IGludGVydmFsWydHQkludGVydmFsX3RvJ10KICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGZlYXR1cmVbJ0dCRmVhdHVyZV9sb2NhdGlvbiddCiAgICAgICAgICAgICAgICAgICAgaWYgbG9jYXRpb24uc3RhcnRzd2l0aCgnY29tcGxlbWVudCcpOgogICAgICAgICAgICAgICAgICAgICAgICBzdHJhbmQgPSAyCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc3RyYW5kID0gMQoKICAgICAgICAgICAgICAgICAgICAjIE5vdyB3ZSBmZXRjaCB0aGUgbnVjbGVvdGlkZSBzZXF1ZW5jZQogICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IEVudHJlei5lZmV0Y2goZGI9Im51Y2xlb3RpZGUiLCBpZD1hY2Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR0eXBlPSJmYXN0YSIsIHN0cmFuZD1zdHJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFfc3RhcnQgPSBpbnRlcnZhbF9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcV9zdG9wID0gaW50ZXJ2YWxfZW5kKQogICAgICAgICAgICAgICAgICAgIHNlcSA9IFNlcUlPLnJlYWQoaGFuZGxlLCAiZmFzdGEiKQoKICAgICAgICAgICAgICAgICAgICBwcmludCgnPkdlbkJhbmsgQWNjZXNzaW9uOnt9Jy5mb3JtYXQoYWNjZXNzaW9uKSkKICAgICAgICAgICAgICAgICAgICBwcmludChzZXEuc2VxKQplZmV0Y2hfaGFuZGxlLmNsb3NlKCkKCmBgYApOb3cgbGV0J3MgYXBwbHkgdGhhdCBzY3JpcHQgdG8gb3VyIGxpc3Qgb2YgRUMgIydzIGJ5IHVzaW5nIHRoZSBjb21tYW5kIGxpbmU6CmBgYHtiYXNoLCBldmFsPUZBTFNFfQp3aGlsZSByZWFkIGxpbmU7ICAgICAKICBkbyBweXRob24gc2NyaXB0cy9udWNsX2Zyb21fZWMucHkgJGxpbmUgPiAiJGxpbmUiLnR4dDsgICAgCiAgZG9uZSA8IGVjX251bWJlcnMudHh0CmBgYAoKYGBge2Jhc2h9CmNkIERvY3VtZW50cy9DT0JTX0NBWlkKbGVzcyAzLjIuMS4zNy50eHQgCmBgYAoKVG8gdXNlIGhwY2M6CkxvdCdzIG9mIGRpc2Mgc3BhY2UsIHRlbXBvcmFyeSB1bmxpbWl0ZWQgKDMgbW9udGhzKQpgYGB7YmFzaH0Kc3NoICoqKioqQGhwY2MubXN1LmVkdQpwYXNzd29yZDoKI1dlIGFyZSBub3cgYXQgdGhlIGdhdGV3YXksIHdlIG11c3QgY29ubmVjdCB0byBhIGRldmVsb3BtZW50IG5vZGUKc3NoIGR2LWludGVsMTYKI05vdyB3ZSBtb3ZlIHRvIGEgc2NyYXRjaCBmb2xkZXIKY2QgL21udC9zY3JhdGNoLyoqKioqCmBgYAoKTm93IHRoYXQgd2UgYXJlIGluIGEgc3BhY2Ugd2hlcmUgd2UgY2FuIGRvd25sb2FkIGRhdGEgYW5kIHBlcmZvcm0gd29yaywgbGV0J3MgZG93bmxvYWQgdGhlIE5DQkkgZGIKYGBge2Jhc2h9CiNNYWtlIGEgZGlyZWN0b3J5IGZvciB0aGlzIHByb2plY3QKbWtkaXIgQ09CU19DQVpZCmNkIENPQlNfQ0FaWS8KI25vdyB3ZSBjcmVhdGUgYSBwcm9ncmFtIHRvIGRvd25sYW9kIHRoZSBkYgplbWFjcyBkb3dubG9hZC5yZWZzZXEucXN1YgpgYGAKCm5vdyBsZXRzIGRvd25sb2FkIGRiIHRvIHRoYXQgIGZ0cDovL2Z0cC5uY2JpLm5sbS5uaWguZ292CnJlZnNlcV9wcm90aWVuLjEwLnRhci5nei5tZDUgYW5kICouZ3ogaXMgd2hhdCB3ZSB3YW50IHRvIHB1dCBvbiBIUENDCmBgYHtiYXNofQpwd2QKY2QgRG9jdW1lbnRzL0NPQlNfQ0FaWS9zY3JpcHRzCmNhdCBkb3dubG9hZC5yZWZzZXEucXN1YgpgYGAKCkluIEhQQzogbW92ZSBvdXQgb2YgZGV2IGludGVsLi4uZXZlcnlvbmUgaXMgdXNpbmcgaXQuIFRoZXJlIGFyZSBtYW55IG1vcmUgY29tcHV0ZXJzIHRvIGNob29zZSBmcm9tIGJlZ2luZCB0aGF0Li4uY2FsbGVkIG5vZGVzCldlIHdhbnQgdG8gd29yayBpbiBhIG5vZGUsIHdlIG5lZWQgdG8gc3VibWl0IGEgam9iIGJ5IHVzaW5nIHFzdWIKYGBge2Jhc2gsIGV2YWw9RkFMU0V9CgpgYGAKClsqKioqKkBkZXYtaW50ZWwxNiB+XSQgY2QgL21udC9zY3JhdGNoLyoqKioqClsqKioqKkBkZXYtaW50ZWwxNiAqKioqKl0kIGxzClsqKioqKkBkZXYtaW50ZWwxNiAqKioqKl0kIG1rZGlyIENPQlNfQ0FaWQpbKioqKipAZGV2LWludGVsMTYgKioqKipdJCBjZCBDT0JTX0NBWlkvClsqKioqKkBkZXYtaW50ZWwxNiBDT0JTX0NBWlldJCBlbWFjcyBkb3dubG9hZC5yZWZzZXEucXN1YgoKWzFdKyAgU3RvcHBlZCAgICAgICAgICAgICAgICAgZW1hY3MgZG93bmxvYWQucmVmc2VxLnFzdWIKWyoqKioqQGRldi1pbnRlbDE2IENPQlNfQ0FaWV0kIGxzCmRvd25sb2FkLnJlZnNlcS5xc3ViICBkb3dubG9hZC5yZWZzZXEucXN1Yn4KWyoqKioqQGRldi1pbnRlbDE2IENPQlNfQ0FaWV0kIHJtICp+ClsqKioqKkBkZXYtaW50ZWwxNiBDT0JTX0NBWlldJCBscwpkb3dubG9hZC5yZWZzZXEucXN1YgpbKioqKipAZGV2LWludGVsMTYgQ09CU19DQVpZXSQgcXN1YiBkb3dubG9hZC5yZWZzZXEucXN1YgozNzUyMzkwNi5tZ3ItMDQuaQpbKioqKipAZGV2LWludGVsMTYgQ09CU19DQVpZXSQgbHMKZG93bmxvYWQucmVmc2VxLnFzdWIKWyoqKioqQGRldi1pbnRlbDE2IENPQlNfQ0FaWV0kCgoubyBpcyBvdXRwdXQsIC5lIGlzIGVycm9yCgpTID0gUSBpbiBsaW5lClMgPSBSIHJ1bm5pbmcKUyA9IEMgY29tcGxldGUKCkNoZWNrIGlmIGV2ZXJ5dGhpbmcgZG93bmxvYWRlZCBjb3JyZWN0bHkgYnkgdXNpbmcgbWQ1KGl0IHRlbGxzIHVzIGlmIGRvd25sb2FkZWQgY29ycmVjdGx5KQpPbmNlIGFsbCBpcyBkb3dubGFvZGVkLCB1bnppcAoKCgpUaGVuIHJlYWR5IHRvIHJ1biBibGFzdHAgKGZpbGVzIGluIGZhc3RhKSBjbG9uZSB0aGUgZ2l0aHViIHJlcG9zaXRvcnkKIyBub3RlIGNoYW5nZSBzcGVsbGluIG9uIHByb3RlaW4gZm9yIGVtYWNzCgptb2R1bGUgbG9hZCBnaXQgKHRvIHVwbG9hZCByZXBvc2l0b3J5KQpnaXQgY2xvbmUgdXJsCm9uY2UgcmVwb3NpdG9yeSBpcyB1cGxvYWRlZCB0aGVuIGJsYXN0cAoKc3VibWl0IGJsYXN0cDogcXN1YiBibGFzdHAucXN1YgoKIzIwMTZfMTJfMDI6MDk6MDYgQU0sIE5vdGljZWQgdGhhdCB3ZSBkaWQgbm90IHFzdWIgYmxhc3RwIGZvciBFQyAqLjg2LCBsZXQncyBtYWtlIHRoYXQgc2NyaXB0IGFuZCBzdWJtaXQgdGhlIGpvYi4gCmBgYHtiYXNoLCBldmFsPUZBTFNFfQpzc2ggKioqKipAaHBjYy5tc3UuZWR1CnBhc3N3b3JkOgpzc2ggZGV2LWludGVsMTYKY2QgL21udC9zY3JhdGNoLyoqKioqL0NPQlNfQ0FaWQpscwoKYGBgCgo=